// RUN: byteir-translate %s --mlir-to-llvmir | FileCheck %s

// CHECK-LABEL: define void @_mlir_ciface_Unknown

module attributes {byre.container_module} {
  llvm.func @Unknown0(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: i64, %arg3: !llvm.ptr, %arg4: !llvm.ptr, %arg5: i64, %arg6: !llvm.ptr, %arg7: !llvm.ptr, %arg8: i64, %arg9: i64, %arg10: i64, %arg11: i64, %arg12: i64) attributes {__byre__kernel_name = "Unknown0", __byre__llvm_file_name = "host_kernels.ll", __byteir_hlo_aggressive_fusion__, arg_offsets = [0 : i32, 1 : i32, 2 : i32], byre_compute_name = "LLVMJITOp", byre_force_compute_name, llvm.emit_c_interface} {
    %0 = llvm.mlir.constant(97 : index) : i64
    %1 = llvm.mlir.constant(1 : index) : i64
    %2 = llvm.mlir.constant(0 : index) : i64
    %3 = llvm.mlir.constant(1103515245 : i32) : i32
    %4 = llvm.mlir.constant(12345 : i32) : i32
    %5 = llvm.mlir.constant(3528531795 : i64) : i64
    %6 = llvm.mlir.constant(3449720151 : i64) : i64
    %7 = llvm.mlir.constant(32 : i64) : i64
    %8 = llvm.mlir.constant(-1640531527 : i32) : i32
    %9 = llvm.mlir.constant(-1150833019 : i32) : i32
    %10 = llvm.mlir.constant(2.3283064365386963E-10 : f64) : f64
    %11 = llvm.mlir.constant(-2.000000e+00 : f32) : f32
    %12 = llvm.mlir.constant(1013904242 : i32) : i32
    %13 = llvm.mlir.constant(1993301258 : i32) : i32
    %14 = llvm.mlir.constant(-626627285 : i32) : i32
    %15 = llvm.mlir.constant(842468239 : i32) : i32
    %16 = llvm.mlir.constant(2027808484 : i32) : i32
    %17 = llvm.mlir.constant(-308364780 : i32) : i32
    %18 = llvm.mlir.constant(387276957 : i32) : i32
    %19 = llvm.mlir.constant(-1459197799 : i32) : i32
    %20 = llvm.mlir.constant(-1253254570 : i32) : i32
    %21 = llvm.mlir.constant(1684936478 : i32) : i32
    %22 = llvm.mlir.constant(1401181199 : i32) : i32
    %23 = llvm.mlir.constant(534103459 : i32) : i32
    %24 = llvm.mlir.constant(-616729560 : i32) : i32
    %25 = llvm.mlir.constant(-1879881855 : i32) : i32
    %26 = llvm.mlir.constant(6.28318548 : f32) : f32
    %27 = llvm.mlir.constant(0.000000e+00 : f32) : f32
    llvm.br ^bb1(%2 : i64)
  ^bb1(%28: i64):  // 2 preds: ^bb0, ^bb2
    %29 = llvm.icmp "slt" %28, %0 : i64
    llvm.cond_br %29, ^bb2, ^bb3
  ^bb2:  // pred: ^bb1
    %30 = llvm.load %arg1 : !llvm.ptr -> i64
    %31 = llvm.load %arg4 : !llvm.ptr -> i64
    %32 = llvm.trunc %30 : i64 to i32
    %33 = llvm.trunc %31 : i64 to i32
    %34 = llvm.add %32, %33 : i32
    %35 = llvm.mul %34, %3 : i32
    %36 = llvm.add %35, %4 : i32
    %37 = llvm.trunc %28 : i64 to i32
    %38 = llvm.add %37, %36 : i32
    %39 = llvm.mul %38, %3 : i32
    %40 = llvm.add %39, %4 : i32
    %41 = llvm.zext %40 : i32 to i64
    %42 = llvm.mul %41, %5 : i64
    %43 = llvm.trunc %42 : i64 to i32
    %44 = llvm.lshr %42, %7  : i64
    %45 = llvm.trunc %44 : i64 to i32
    %46 = llvm.xor %45, %33  : i32
    %47 = llvm.add %32, %8 : i32
    %48 = llvm.add %33, %9 : i32
    %49 = llvm.zext %32 : i32 to i64
    %50 = llvm.zext %46 : i32 to i64
    %51 = llvm.mul %49, %5 : i64
    %52 = llvm.trunc %51 : i64 to i32
    %53 = llvm.lshr %51, %7  : i64
    %54 = llvm.trunc %53 : i64 to i32
    %55 = llvm.mul %50, %6 : i64
    %56 = llvm.trunc %55 : i64 to i32
    %57 = llvm.lshr %55, %7  : i64
    %58 = llvm.trunc %57 : i64 to i32
    %59 = llvm.xor %58, %47  : i32
    %60 = llvm.xor %54, %43  : i32
    %61 = llvm.xor %60, %48  : i32
    %62 = llvm.add %32, %12 : i32
    %63 = llvm.add %33, %13 : i32
    %64 = llvm.zext %59 : i32 to i64
    %65 = llvm.zext %61 : i32 to i64
    %66 = llvm.mul %64, %5 : i64
    %67 = llvm.trunc %66 : i64 to i32
    %68 = llvm.lshr %66, %7  : i64
    %69 = llvm.trunc %68 : i64 to i32
    %70 = llvm.mul %65, %6 : i64
    %71 = llvm.trunc %70 : i64 to i32
    %72 = llvm.lshr %70, %7  : i64
    %73 = llvm.trunc %72 : i64 to i32
    %74 = llvm.xor %73, %56  : i32
    %75 = llvm.xor %74, %62  : i32
    %76 = llvm.xor %69, %52  : i32
    %77 = llvm.xor %76, %63  : i32
    %78 = llvm.add %32, %14 : i32
    %79 = llvm.add %33, %15 : i32
    %80 = llvm.zext %75 : i32 to i64
    %81 = llvm.zext %77 : i32 to i64
    %82 = llvm.mul %80, %5 : i64
    %83 = llvm.trunc %82 : i64 to i32
    %84 = llvm.lshr %82, %7  : i64
    %85 = llvm.trunc %84 : i64 to i32
    %86 = llvm.mul %81, %6 : i64
    %87 = llvm.trunc %86 : i64 to i32
    %88 = llvm.lshr %86, %7  : i64
    %89 = llvm.trunc %88 : i64 to i32
    %90 = llvm.xor %89, %71  : i32
    %91 = llvm.xor %90, %78  : i32
    %92 = llvm.xor %85, %67  : i32
    %93 = llvm.xor %92, %79  : i32
    %94 = llvm.add %32, %16 : i32
    %95 = llvm.add %33, %17 : i32
    %96 = llvm.zext %91 : i32 to i64
    %97 = llvm.zext %93 : i32 to i64
    %98 = llvm.mul %96, %5 : i64
    %99 = llvm.trunc %98 : i64 to i32
    %100 = llvm.lshr %98, %7  : i64
    %101 = llvm.trunc %100 : i64 to i32
    %102 = llvm.mul %97, %6 : i64
    %103 = llvm.trunc %102 : i64 to i32
    %104 = llvm.lshr %102, %7  : i64
    %105 = llvm.trunc %104 : i64 to i32
    %106 = llvm.xor %105, %87  : i32
    %107 = llvm.xor %106, %94  : i32
    %108 = llvm.xor %101, %83  : i32
    %109 = llvm.xor %108, %95  : i32
    %110 = llvm.add %32, %18 : i32
    %111 = llvm.add %33, %19 : i32
    %112 = llvm.zext %107 : i32 to i64
    %113 = llvm.zext %109 : i32 to i64
    %114 = llvm.mul %112, %5 : i64
    %115 = llvm.trunc %114 : i64 to i32
    %116 = llvm.lshr %114, %7  : i64
    %117 = llvm.trunc %116 : i64 to i32
    %118 = llvm.mul %113, %6 : i64
    %119 = llvm.trunc %118 : i64 to i32
    %120 = llvm.lshr %118, %7  : i64
    %121 = llvm.trunc %120 : i64 to i32
    %122 = llvm.xor %121, %103  : i32
    %123 = llvm.xor %122, %110  : i32
    %124 = llvm.xor %117, %99  : i32
    %125 = llvm.xor %124, %111  : i32
    %126 = llvm.add %32, %20 : i32
    %127 = llvm.add %33, %21 : i32
    %128 = llvm.zext %123 : i32 to i64
    %129 = llvm.zext %125 : i32 to i64
    %130 = llvm.mul %128, %5 : i64
    %131 = llvm.trunc %130 : i64 to i32
    %132 = llvm.lshr %130, %7  : i64
    %133 = llvm.trunc %132 : i64 to i32
    %134 = llvm.mul %129, %6 : i64
    %135 = llvm.trunc %134 : i64 to i32
    %136 = llvm.lshr %134, %7  : i64
    %137 = llvm.trunc %136 : i64 to i32
    %138 = llvm.xor %137, %119  : i32
    %139 = llvm.xor %138, %126  : i32
    %140 = llvm.xor %133, %115  : i32
    %141 = llvm.xor %140, %127  : i32
    %142 = llvm.add %32, %22 : i32
    %143 = llvm.add %33, %23 : i32
    %144 = llvm.zext %139 : i32 to i64
    %145 = llvm.zext %141 : i32 to i64
    %146 = llvm.mul %144, %5 : i64
    %147 = llvm.trunc %146 : i64 to i32
    %148 = llvm.lshr %146, %7  : i64
    %149 = llvm.trunc %148 : i64 to i32
    %150 = llvm.mul %145, %6 : i64
    %151 = llvm.lshr %150, %7  : i64
    %152 = llvm.trunc %151 : i64 to i32
    %153 = llvm.xor %152, %135  : i32
    %154 = llvm.xor %153, %142  : i32
    %155 = llvm.xor %149, %131  : i32
    %156 = llvm.xor %155, %143  : i32
    %157 = llvm.add %33, %24 : i32
    %158 = llvm.zext %154 : i32 to i64
    %159 = llvm.zext %156 : i32 to i64
    %160 = llvm.mul %158, %5 : i64
    %161 = llvm.lshr %160, %7  : i64
    %162 = llvm.trunc %161 : i64 to i32
    %163 = llvm.mul %159, %6 : i64
    %164 = llvm.trunc %163 : i64 to i32
    %165 = llvm.xor %162, %147  : i32
    %166 = llvm.xor %165, %157  : i32
    %167 = llvm.add %32, %25 : i32
    %168 = llvm.zext %166 : i32 to i64
    %169 = llvm.mul %168, %6 : i64
    %170 = llvm.trunc %169 : i64 to i32
    %171 = llvm.lshr %169, %7  : i64
    %172 = llvm.trunc %171 : i64 to i32
    %173 = llvm.xor %172, %164  : i32
    %174 = llvm.xor %173, %167  : i32
    %175 = llvm.zext %174 : i32 to i64
    %176 = llvm.uitofp %175 : i64 to f64
    %177 = llvm.fmul %176, %10  : f64
    %178 = llvm.fptrunc %177 : f64 to f32
    %179 = llvm.zext %170 : i32 to i64
    %180 = llvm.uitofp %179 : i64 to f64
    %181 = llvm.fmul %180, %10  : f64
    %182 = llvm.fptrunc %181 : f64 to f32
    %183 = llvm.intr.log(%178)  : (f32) -> f32
    %184 = llvm.fmul %183, %11  : f32
    %185 = llvm.intr.sqrt(%184)  : (f32) -> f32
    %186 = llvm.fmul %182, %26  : f32
    %187 = llvm.intr.cos(%186)  : (f32) -> f32
    %188 = llvm.fmul %185, %187  : f32
    %189 = llvm.fadd %188, %27  : f32
    %190 = llvm.mul %2, %0 : i64
    %191 = llvm.add %190, %28 : i64
    %192 = llvm.getelementptr %arg7[%191] : (!llvm.ptr, i64) -> !llvm.ptr, f32
    llvm.store %189, %192 : f32, !llvm.ptr
    %193 = llvm.add %28, %1 : i64
    llvm.br ^bb1(%193 : i64)
  ^bb3:  // pred: ^bb1
    llvm.return
  }
  llvm.func @_mlir_ciface_Unknown0(%arg0: !llvm.ptr, %arg1: !llvm.ptr, %arg2: !llvm.ptr) attributes {__byre__kernel_name = "Unknown0", __byre__llvm_file_name = "host_kernels.ll", __byteir_hlo_aggressive_fusion__, arg_offsets = [0 : i32, 1 : i32, 2 : i32], byre_compute_name = "LLVMJITOp", byre_force_compute_name, llvm.emit_c_interface} {
    %0 = llvm.load %arg0 : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64)>
    %1 = llvm.extractvalue %0[0] : !llvm.struct<(ptr, ptr, i64)> 
    %2 = llvm.extractvalue %0[1] : !llvm.struct<(ptr, ptr, i64)> 
    %3 = llvm.extractvalue %0[2] : !llvm.struct<(ptr, ptr, i64)> 
    %4 = llvm.load %arg1 : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64)>
    %5 = llvm.extractvalue %4[0] : !llvm.struct<(ptr, ptr, i64)> 
    %6 = llvm.extractvalue %4[1] : !llvm.struct<(ptr, ptr, i64)> 
    %7 = llvm.extractvalue %4[2] : !llvm.struct<(ptr, ptr, i64)> 
    %8 = llvm.load %arg2 : !llvm.ptr -> !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)>
    %9 = llvm.extractvalue %8[0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)> 
    %10 = llvm.extractvalue %8[1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)> 
    %11 = llvm.extractvalue %8[2] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)> 
    %12 = llvm.extractvalue %8[3, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)> 
    %13 = llvm.extractvalue %8[3, 1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)> 
    %14 = llvm.extractvalue %8[4, 0] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)> 
    %15 = llvm.extractvalue %8[4, 1] : !llvm.struct<(ptr, ptr, i64, array<2 x i64>, array<2 x i64>)> 
    llvm.call @Unknown0(%1, %2, %3, %5, %6, %7, %9, %10, %11, %12, %13, %14, %15) : (!llvm.ptr, !llvm.ptr, i64, !llvm.ptr, !llvm.ptr, i64, !llvm.ptr, !llvm.ptr, i64, i64, i64, i64, i64) -> ()
    llvm.return
  }
}